#pragma std_c99

#include <stdint.h>

#ifdef __SDCC_LONGLONG
// This function is the same as the one from rrslonglong_rrx_s.c, except for the type of top, and b[3].
unsigned long long _rrulonglong( unsigned long long l, signed char s ) {
  uint32_t *const top = ( uint32_t * )( ( char * )( &l ) + 4 );
  uint16_t *const middle = ( uint16_t * )( ( char * )( &l ) + 3 );
  uint32_t *const bottom = ( uint32_t * )( &l );
  uint16_t *const b = ( uint16_t * )( &l );
  for( ; s >= 16; s -= 16 ) {
    b[0] = b[1];
    b[1] = b[2];
    b[2] = b[3];
    b[3] = 0x000000;
  }
  ( *bottom ) >>= s;
  ( *middle ) |= ( ( ( *middle ) & 0xffff0000ul ) >> s );
  ( *top ) |= ( ( ( *middle ) & 0xffff0000ul ) >> s );
  return( l );
}
#endif

